package org.jeecg.modules.demo.weixin.smtstoredvalueusers.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.SneakyThrows;
import org.apache.commons.lang3.ObjectUtils;
import org.jeecg.modules.demo.weixin.dto.PayDto;
import org.jeecg.modules.demo.weixin.entity.SmtStoredValueUsers;
import org.jeecg.modules.demo.weixin.smtstoredvalueusers.mapper.SmtStoredValueUsersMapper;
import org.jeecg.modules.demo.weixin.smtstoredvalueusers.service.ISmtStoredValueUsersService;
import org.jeecg.modules.demo.weixin.smtvaluerecord.service.ISmtValueRecordService;
import org.jeecg.modules.demo.weixin.util.MD5Util;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * @Description: smt_stored_value_users
 * @Author: jeecg-boot
 * @Date: 2023-10-30
 * @Version: V1.0
 */
@Service
public class SmtStoredValueUsersServiceImpl extends ServiceImpl<SmtStoredValueUsersMapper, SmtStoredValueUsers> implements ISmtStoredValueUsersService {

    @Autowired
    private ISmtValueRecordService smtValueRecordService;

    @SneakyThrows
    @Override
    public void saveStoreUser(PayDto payDto) {
        //先查询是否在当前商家有用户卡点 有的话更新剩余金额否则新增
        QueryWrapper<SmtStoredValueUsers> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", payDto.getUid());
        queryWrapper.eq("merchant_id", payDto.getMerId());
        SmtStoredValueUsers smtStoredValueUsers = this.getOne(queryWrapper);
        if (ObjectUtils.isNotEmpty(smtStoredValueUsers)) {
            //计算剩余金额
            BigDecimal restAmount = smtStoredValueUsers.getValueRest().add(payDto.getTotalPrice());
            smtStoredValueUsers.setValueRest(restAmount);
            this.updateById(smtStoredValueUsers);
        } else {
            SmtStoredValueUsers valueUsers = new SmtStoredValueUsers();
            BeanUtils.copyProperties(payDto, valueUsers);

            //生成用户卡点号
            String valueNumber = MD5Util.encryptMd5(RandomUtil.randomString(6));
            valueUsers.setValueNumber(valueNumber);
            valueUsers.setUserId(payDto.getUid());
            valueUsers.setValueRest(payDto.getTotalPrice());
            valueUsers.setMerchantId(Integer.parseInt(payDto.getMerId()));
            this.save(valueUsers);
        }
    }

//    /**
//     * 用户卡点退款退款功能      type 1 但单表储值退款     2   用户卡点支付的退款
//     *
//     * @param price
//     * @param priceGive
//     * @param type
//     * @param valueNumber
//     * @return
//     */
//    public Boolean subPrice(BigDecimal price, BigDecimal priceGive, Integer type, String valueNumber, String orderNo) {
//        //用户卡点支付逻辑 先查出对应用户卡点
//        LambdaQueryWrapper<SmtStoredValueUsers> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(SmtStoredValueUsers::getValueNumber, valueNumber);
//        SmtStoredValueUsers storedValueUsers = this.getOne(queryWrapper);
//        if (storedValueUsers == null) {
//            return Boolean.FALSE;
//        }
//        if ((storedValueUsers.getValueRest().add(storedValueUsers.getValueGive())).compareTo(price) < 0) {
//            return Boolean.FALSE;
//        }
//        //储值退款
//        if (type.equals(1)) {
//            //充值退款需要都扣除   如果订单支付金额  和  赠送金额 大于 用户卡点本金和赠送  则无法退还
//            if (storedValueUsers.getValueRest().compareTo(price) < 0 && storedValueUsers.getValueGive().compareTo(priceGive) < 0) {
//                return Boolean.FALSE;
//            }
//            storedValueUsers.setValueRest(storedValueUsers.getValueRest().subtract(price));
//            storedValueUsers.setValueGive(storedValueUsers.getValueGive().subtract(priceGive));
//
//        }
//
//        //用户卡点支付的时候
//        if (type.equals(2)) {
//            SmtValueRecord smtValueRecord = new SmtValueRecord();
//            //如果用户用户卡点的赠送金额=0的话   直接支付本金
//            if (storedValueUsers.getValueGive().compareTo(BigDecimal.valueOf(0)) == 0) {
//                storedValueUsers.setValueRest(storedValueUsers.getValueRest().subtract(price));
//                smtValueRecord.setPrice(price);
//                smtValueRecord.setValuePrice(price);
//            }
//            //如果用户的储值金额不等于0 的时候
//            if (storedValueUsers.getValueGive().compareTo(BigDecimal.valueOf(0)) > 0) {
//                //支付的本机是
//                BigDecimal principal = price.multiply(storedValueUsers.getValueRest().divide(storedValueUsers.getValueRest().add(storedValueUsers.getValueGive()),BigDecimal.ROUND_CEILING)).setScale(2,4);
//                BigDecimal giveValue = price.subtract(principal);
//                storedValueUsers.setValueRest(storedValueUsers.getValueRest().subtract(principal));
//                storedValueUsers.setValueGive(storedValueUsers.getValueGive().subtract(giveValue));
//                //用户卡点支付记录
//                smtValueRecord.setPrice(price);
//                smtValueRecord.setValuePrice(principal);
//                smtValueRecord.setValueGivePrice(giveValue);
//
//            }
//            smtValueRecord.setOrderNo(orderNo);
//            smtValueRecordService.save(smtValueRecord);
//
//        }
//
//
//        this.updateById(storedValueUsers);
//        return Boolean.TRUE;
//    }
//
//    @Override
//    public Boolean addPrice(BigDecimal price, BigDecimal priceGive, Integer type, String valueNumber, String orderNo) {
//        LambdaQueryWrapper<SmtStoredValueUsers> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(SmtStoredValueUsers::getValueNumber, valueNumber);
//        SmtStoredValueUsers storedValueUsers = this.getOne(queryWrapper);
//        if (storedValueUsers == null) {
//            return Boolean.FALSE;
//        }
//        //用户充值
//        if (type.equals(1)) {
//            storedValueUsers.setValueRest(storedValueUsers.getValueRest().add(price));
//            if (priceGive.compareTo(BigDecimal.valueOf(0)) > 0) {
//                storedValueUsers.setValueGive(storedValueUsers.getValueGive().add(priceGive));
//            }
//        }
//
//        //用户卡点支付退款
//        if (type.equals(2)) {
//
//            //查询用户卡点支付记录
//            LambdaQueryWrapper<SmtValueRecord> smtValueRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
//            smtValueRecordLambdaQueryWrapper.eq(SmtValueRecord::getOrderNo, orderNo);
//            smtValueRecordLambdaQueryWrapper.eq(SmtValueRecord::getStatus, 0);
//            SmtValueRecord recordServiceOne = smtValueRecordService.getOne(smtValueRecordLambdaQueryWrapper);
//            if (recordServiceOne == null) {
//                return Boolean.FALSE;
//            }
//            //如果退款金额大于 支付金额
//            if (recordServiceOne.getPrice().compareTo(price) < 0) {
//                return Boolean.FALSE;
//            }
//            //如果退款金额等于支付金额  则直接退还
//            if (recordServiceOne.getPrice().compareTo(price) == 0) {
//                storedValueUsers.setValueRest(storedValueUsers.getValueRest().add(recordServiceOne.getValuePrice()));
//                storedValueUsers.setValueGive(storedValueUsers.getValueGive().add(recordServiceOne.getValueGivePrice()));
//            }
//            //如果退款金额小于支付金额
//            if (recordServiceOne.getPrice().compareTo(price) > 0) {
//                //如果退款金额没有赠送金额
//                if (recordServiceOne.getValueGivePrice().compareTo(BigDecimal.valueOf(0)) == 0) {
//                    storedValueUsers.setValueRest(storedValueUsers.getValueRest().add(price));
//                }
//                if (recordServiceOne.getValueGivePrice().compareTo(BigDecimal.valueOf(0)) > 0) {
//                    //如果退款金额小于用户卡点的金额  并且  还有赠送金额
//                    BigDecimal refund = price.multiply(recordServiceOne.getValuePrice().divide(recordServiceOne.getValuePrice().add(storedValueUsers.getValueGive()),BigDecimal.ROUND_CEILING)).setScale(2,4);
//                    storedValueUsers.setValueRest(storedValueUsers.getValueRest().add(refund));
//                    storedValueUsers.setValueGive(storedValueUsers.getValueGive().add(price.subtract(refund)));
//                }
//            }
//
//            recordServiceOne.setStatus(1);
//            smtValueRecordService.updateById(recordServiceOne);
//        }
//
//
//        this.updateById(storedValueUsers);
//        return Boolean.TRUE;
//    }

}
